package Demo6;

/**
 * 内部类
 * 1.实例内部类
 * 2.静态内部类
 * 3.局部内部类
 * 4.匿名内部类
 */


//实例内部类
class Outclass {
    public int data1 = 1;
    static int data2 = 2;
    protected int data3 = 3;
    class Intclass{
        public int data1 = 111;
        //static int data5 = 5;//实例内部类需要依附外部类 所以内部类不允许静态成员存在
        static final int data5 = 5;//可以加上final 让他变成常量 常量不依附任何类 在编译时就确定了
        protected  int data6;
        public void test() {//内部类访问 内/外 部类 成员都是没问题的
            Outclass outclass = new Outclass();//先实例内部类
            System.out.println(this.data1);//当内外部类名一样时 有内部用内部 有没内部用外部
            System.out.println(data2);
            System.out.println(Outclass.this.data3);//在内部类访问内部类 可以使用 外部类类名.this.成员变量名 来访问外部类成员
            //System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }


    public void test() {
        //实例内部类
        Intclass intclass = new Intclass();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        //1.外部类是无法访问内部类的 ，如果需要访问需要先实例内部类
        System.out.println(intclass.data5);
        System.out.println(intclass.data6);
    }
}
public class Text {
    public static void main(String[] args) {
        Outclass outclass = new Outclass();//先实例外部类
        Outclass.Intclass intclass = outclass.new Intclass();//通过外部类的引用再实例内部类
        outclass.test();
        intclass.test();
    }

}
